home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’93
/
HackTV & Example panel comp.
/
ExampleVideoPanel.c
< prev
next >
Wrap
Text File
|
1993-08-18
|
17KB
|
681 lines
/*
File: ExampleVideoPanel.c
Contains: Example video panel component routines.
Written by: Gary Woodcock
Refer to develop Issue 14, "Video Digitizing Under QuickTime",
for details on this code.
Copyright: © 1992-1993 by Apple Computer, Inc.
Change History (most recent first):
*/
//-----------------------------------------------------------------------
// includes
#include "ExampleVideoPanelPrivate.h"
#include <QuickTimeComponents.h>
#include <Errors.h>
#include <Resources.h>
#include <SysEqu.h>
//-----------------------------------------------------------------------
#ifdef DEBUG_ME
// Use this declaration when we're running linked (for debugging)
pascal ComponentResult
ExampleVideoPanelDispatcher (ComponentParameters *params, Handle storage)
#else
// Use this declaration when we're a standalone component
pascal ComponentResult
main (ComponentParameters *params, Handle storage)
#endif DEBUG_ME
{
// This routine is the main dispatcher for the component
ComponentResult result = noErr;
ComponentFunction exampleFunction = nil;
// Did we get a Component Manager request code (< 0)?
if (params->what < 0)
{
switch (params->what)
{
case kComponentOpenSelect: // Open request
{
exampleFunction = _ExampleVideoPanelOpen;
break;
}
case kComponentCloseSelect: // Close request
{
exampleFunction = _ExampleVideoPanelClose;
break;
}
case kComponentCanDoSelect: // Can Do request
{
result = CallComponentFunction (params,
(ComponentFunction) _ExampleVideoPanelCanDo);
break;
}
case kComponentVersionSelect: // Version request
{
result = CallComponentFunction (params,
(ComponentFunction) _ExampleVideoPanelVersion);
break;
}
case kComponentTargetSelect: // Target request not supported
case kComponentRegisterSelect: // Register request not supported
default: // Unknown request
{
result = badComponentSelector;
break;
}
}
}
else // Was it one of our request codes?
{
switch (params->what)
{
case kSGCPanelGetDitlSelect: // SGPanelGetDitl request
{
exampleFunction = _ExampleVideoPanelGetDitl;
break;
}
case kSGCPanelGetTitleSelect: // SGPanelGetTitle request
{
exampleFunction = _ExampleVideoPanelGetTitle;
break;
}
case kSGCPanelCanRunSelect: // SGPanelCanRun request
{
exampleFunction = _ExampleVideoPanelCanRun;
break;
}
case kSGCPanelInstallSelect: // SGPanelInstall request
{
exampleFunction = _ExampleVideoPanelInstall;
break;
}
case kSGCPanelEventSelect: // SGPanelEvent request
{
exampleFunction = _ExampleVideoPanelEvent;
break;
}
case kSGCPanelItemSelect: // SGPanelItem request
{
exampleFunction = _ExampleVideoPanelItem;
break;
}
case kSGCPanelRemoveSelect: // SGPanelRemove request
{
exampleFunction = _ExampleVideoPanelRemove;
break;
}
case kSGCPanelSetGrabberSelect: // SGPanelSetGrabber request
{
exampleFunction = _ExampleVideoPanelSetGrabber;
break;
}
case kSGCPanelSetResFileSelect: // SGPanelSetResFile request
{
exampleFunction = _ExampleVideoPanelSetResFile;
break;
}
case kSGCPanelGetSettingsSelect: // SGPanelGetSettings request
{
exampleFunction = _ExampleVideoPanelGetSettings;
break;
}
case kSGCPanelSetSettingsSelect: // SGPanelSetSettings request
{
exampleFunction = _ExampleVideoPanelSetSettings;
break;
}
default: // Unknown request
{
result = badComponentSelector;
break;
}
}
}
if (exampleFunction != nil)
{
result = CallComponentFunctionWithStorage (storage, params, exampleFunction);
}
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelOpen (Handle storage, ComponentInstance self)
{
#pragma unused (storage)
PanelGlobalsHdl globals;
ComponentResult result = noErr;
#ifdef THINK_C
SetComponentInstanceA5 (self, *(long *) CurrentA5);
#endif THINK_C
// Can we open another instance?
if (CountComponentInstances ((Component) self) <= kMaxExampleVideoPanelInstances)
{
// Did we get our storage?
globals = (PanelGlobalsHdl) NewHandleClear (sizeof (PanelGlobals));
if (globals != nil)
{
// Keep a reference to self
(**globals).self = (Component) self;
// Set storage ref
SetComponentInstanceStorage (self, (Handle) globals);
}
else // NewHandleClear failed
{
result = MemError();
}
}
else // No more instances can be opened
{
result = kGenericError;
}
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelClose (Handle storage, ComponentInstance self)
{
PanelGlobalsHdl globals = (PanelGlobalsHdl) storage;
ComponentResult result = noErr;
// Do we have any clean up to do?
if (globals != nil)
{
// Dispose globals
DisposHandle ((Handle) globals);
}
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelCanDo (short selector)
{
// Case on the request code
switch (selector)
{
// Component Manager request codes
case kComponentOpenSelect:
case kComponentCloseSelect:
case kComponentCanDoSelect:
case kComponentVersionSelect:
// Sequence grabber panel component request codes
case kSGCPanelGetDitlSelect:
case kSGCPanelGetTitleSelect:
case kSGCPanelCanRunSelect:
case kSGCPanelInstallSelect:
case kSGCPanelEventSelect:
case kSGCPanelItemSelect:
case kSGCPanelRemoveSelect:
case kSGCPanelSetGrabberSelect:
case kSGCPanelSetResFileSelect:
case kSGCPanelGetSettingsSelect:
case kSGCPanelSetSettingsSelect:
{
return (true);
}
// Unsupported or unknown request codes
case kComponentRegisterSelect: // Register request not supported
case kComponentTargetSelect: // Target request not supported
default: // Not a request code we recognize
{
return (false);
}
}
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelVersion (void)
{
// Return the version info
return (exampleVideoPanelInterfaceRevision);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelGetDitl (Handle storage, Handle *ditl)
{
// This routine gets our ditl and hands it back to the sequence grabber
#pragma unused (storage)
ComponentResult result = noErr;
Handle panelDITL = GetResource ('DITL', kExampleVideoPanelDITLID);
short savedResFile = CurResFile();
#ifdef THINK_C
short myResFile = CurResFile();
#else
short myResFile = OpenComponentResFile ((**globals).self);
#endif
if ((myResFile != -1) && ((result = ResError()) == noErr))
{
UseResFile (myResFile);
// Did we get the DITL resource okay?
result = ResError();
if (panelDITL != nil)
{
// Detach it
DetachResource (panelDITL);
}
UseResFile (savedResFile);
}
*ditl = panelDITL;
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelGetTitle (Handle storage, Str255 title)
{
#pragma unused (storage)
#pragma unused (title)
// Nothing to do here right now
return (paramErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelCanRun (Handle storage, SGChannel c)
{
#pragma unused (storage)
#pragma unused (c)
// Our 'thng' resource has the channelFlagHasDependency flag set,
// which means that this routine gets called to find out if
// it can run in the current environment. This usually means
// finding out if the panel is compatible with the currently
// selected digitizer. This is handy for adding manufacturer
// specific panels to the settings dialog. We don't do anything
// here except SysBeep just to show we actually get called.
SysBeep(5);
return (noErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelInstall (Handle storage, SGChannel c, DialogPtr d,
short itemOffset)
{
// Do our setup in this routine
#pragma unused (d)
#pragma unused (itemOffset)
PanelGlobalsHdl globals = (PanelGlobalsHdl) storage;
ComponentResult result = noErr;
// Get our gray pattern
*(long *)((**globals).grayPat) = *(long *)((**globals).grayPat + 4) = 0x55AA55AA;
// Get current black level
result = VDGetBlackLevelValue (SGGetVideoDigitizerComponent (c), &((**globals).savedBlackLevel));
if (result != noErr)
{
// Can't get the black level, so we can't do zero black level
HiliteControl ((ControlHandle) GetItemHandle (d, itemOffset + kZeroBlackButton), 255);
}
return (noErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelEvent (Handle storage, SGChannel c, DialogPtr d,
short itemOffset, EventRecord *theEvent, short *itemHit, Boolean *handled)
{
// This routine is quite similar to a normal event filter proc.
PanelGlobalsHdl globals = (PanelGlobalsHdl) storage;
ComponentResult result = noErr;
GrafPtr savedPort;
PenState savedPen;
// Set up the port stuff
GetPort (&savedPort);
SetPort (d);
GetPenState (&savedPen);
// Assume we don't handle it
*handled = false;
// Look for a key hit
if ((theEvent->what == keyDown) || (theEvent->what == autoKey))
{
char theChar = theEvent->message & charCodeMask;
char theKeyCode = ((theEvent->message & keyCodeMask) >> 8);
Boolean cmdKeyDown = ((theEvent->modifiers & cmdKey) != 0) ? true : false;
if (cmdKeyDown && (theKeyCode == kDKey))
{
unsigned short maxBlackLevel = 0;
// Fake a "Do it" button hit
FakeDialogButtonHit (d, itemOffset + kZeroBlackButton);
result = VDSetBlackLevelValue (SGGetVideoDigitizerComponent (c), &maxBlackLevel);
*itemHit = itemOffset + kZeroBlackButton;
*handled = true;
}
else if (cmdKeyDown && (theKeyCode == kRKey))
{
// Fake a "Reset" button hit
FakeDialogButtonHit (d, itemOffset + kResetButton);
result = VDSetBlackLevelValue (SGGetVideoDigitizerComponent (c), &((**globals).savedBlackLevel));
*itemHit = itemOffset + kResetButton;
*handled = true;
}
}
else if (theEvent->what == updateEvt)
{
Rect r;
// Draw the separator line whenever we get an update cuz I'm lazy
GetItemBox (d, itemOffset + kSeparator, &r);
PenPat ((**globals).grayPat);
FrameRect (&r);
}
// Restore stuff
SetPenState (&savedPen);
SetPort (savedPort);
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelItem (Handle storage, SGChannel c, DialogPtr d,
short itemOffset, short itemNum)
{
#pragma unused (d)
PanelGlobalsHdl globals = (PanelGlobalsHdl) storage;
ComponentResult result = noErr;
short theItem = itemNum - itemOffset; // Remember to account for the item offset
// What item got hit?
switch (theItem)
{
case kZeroBlackButton:
{
unsigned short maxBlackLevel = 0;
result = VDSetBlackLevelValue (SGGetVideoDigitizerComponent (c), &maxBlackLevel);
break;
}
case kResetButton:
{
result = VDSetBlackLevelValue (SGGetVideoDigitizerComponent (c), &((**globals).savedBlackLevel));
break;
}
default:
{
break;
}
}
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelRemove (Handle storage, SGChannel c, DialogPtr d,
short itemOffset)
{
#pragma unused (storage)
#pragma unused (c)
#pragma unused (d)
#pragma unused (itemOffset)
// This is where you do your panel related cleanup. Note that
// this is different from the cleanup you do in your close component
// routine. Basically, this gets called when your ditl is getting
// removed from the dialog and a new one is being added (like when
// someone chooses a different panel from the panel popup menu).
// Examples of stuff you might do here include getting rid of any
// custom controls or popup menus, or saving panel settings.
return (noErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelSetGrabber (Handle storage, SeqGrabComponent sg)
{
PanelGlobalsHdl globals = (PanelGlobalsHdl) storage;
// Save our grabber
(**globals).seqGrabber = sg;
return (noErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelSetResFile (Handle storage, short resRef)
{
PanelGlobalsHdl globals = (PanelGlobalsHdl) storage;
// Since we don't have the channelFlagDontOpenResFile flag
// set in our 'thng' resource, the sequence grabber will
// open our resource file for us.
// Save our resfile ref
(**globals).resRefNum = resRef;
return (noErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelGetSettings (Handle storage, SGChannel c, UserData *ud, long flags)
{
#pragma unused (c)
#pragma unused (flags)
ComponentResult result = noErr;
UserData userStuff = 0L;
// You HAVE to give something valid back as user data when you
// return from this routine or your panel will fail to install.
// What is being asked for basically amounts to a handle to some
// state info specific to your panel. We don't really have any
// state info we care about, so we just hand back an empty user
// data just to keep everyone happy.
if ((result = NewUserData (&userStuff)) == noErr)
{
*ud = userStuff;
}
return (result);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelSetSettings (Handle storage, SGChannel c, UserData ud, long flags)
{
#pragma unused (storage)
#pragma unused (c)
#pragma unused (ud)
#pragma unused (flags)
// Here is where you would decode your user data structure and use
// the info to set the state of your panel items. Again, we don't
// really have anything that has any meaningful state in our panel,
// so we ignore this.
return (noErr);
}
//-----------------------------------------------------------------------
pascal ComponentResult
_ExampleVideoPanelValidateInput (Handle storage, Boolean *ok)
{
#pragma unused (storage)
// This is where you do a sanity check on the user-definable
// items in your panel. If there are any bad values, you
// should alert the user somehow, and return false for *ok.
// If everything's fine, return true. We don't really have
// anything to check on in our example, so we return true
// all the time.
*ok = true;
return (noErr);
}
//-----------------------------------------------------------------------
static OSErr
FakeButtonHit (ControlHandle theButton)
{
OSErr result = noErr;
if (theButton != nil)
{
long dummyTicks = 0L;
HiliteControl (theButton, inButton);
Delay (8, &dummyTicks);
HiliteControl (theButton, 0);
}
else
{
result = nilHandleErr;
}
return (result);
}
//-----------------------------------------------------------------------
static OSErr
FakeDialogButtonHit (DialogPtr theDialog, short theButtonItem)
{
OSErr result = noErr;
if (theDialog != nil)
{
result = FakeButtonHit ((ControlHandle) GetItemHandle (theDialog, theButtonItem));
}
else
{
result = nilHandleErr;
}
return (result);
}
//-----------------------------------------------------------------------
static void
SetUserItem (DialogPtr theDialog, short theItem, Handle userProc)
{
Handle item;
Rect box;
short itemType;
GetDItem (theDialog, theItem, &itemType, &item, &box);
SetDItem (theDialog, theItem, itemType, userProc, &box);
}
//-----------------------------------------------------------------------
static Handle
GetItemHandle (DialogPtr theDialog, short theItem)
{
Handle item;
Rect box;
short itemType;
GetDItem (theDialog, theItem, &itemType, &item, &box);
return (item);
}
//-----------------------------------------------------------------------
static void
GetItemBox (DialogPtr theDialog, short theItem, Rect *theRect)
{
Handle item;
short itemType;
GetDItem (theDialog, theItem, &itemType, &item, theRect);
}
//-----------------------------------------------------------------------
#ifdef THINK_C
#ifdef DEBUG_ME
Component
RegisterExampleVideoPanel (void)
{
ComponentDescription foo;
Handle h;
Component theCompID;
foo.componentType = SeqGrabPanelType;
foo.componentSubType = 'vide';
foo.componentManufacturer = 'xmpl';
foo.componentFlags = channelFlagDontOpenResFile | channelFlagHasDependency; // Indicate that we want a can run message
foo.componentFlagsMask = 0L;
PtrToHand ("\pExample (linked)", &h, 17);
theCompID = RegisterComponent (&foo, (void *)ExampleVideoPanelDispatcher, 0, h, 0, 0);
if (h != nil)
{
DisposHandle (h);
}
return (theCompID);
}
#endif DEBUG_ME
#endif THINK_C
//-----------------------------------------------------------------------